package com.bdqn.spark.chapter05.kv

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

object Spark18_RDD_Operator_Transform {
  def main(args: Array[String]): Unit = {
    val sparkConf = new SparkConf()
      .setMaster("local[*]")
      .setAppName("operator-reducebykey")
    val sc = new SparkContext(sparkConf)

    val sourceRDD: RDD[(String, Int)] = sc.makeRDD(List(
      ("a", 1), ("b", 2), ("a", 3), ("b", 4), ("c", 5)
    ))

    val resultRDD: RDD[(String, Int)] = {
      // reduceByKey 本质上，调用了下面的方法
      // combineByKeyWithClassTag[V]((v: V) => v, func, func, partitioner)
      sourceRDD.reduceByKey(
        // 第一个参数：表示中间的计算结果
        // 第二个参数：表示RDD中的每一个KV元素的Value
        (mid, `val`) => {
          // 如果分组中，只有一个KV键值对，则改函数不执行
          println(s"${`val`}计算了")
          mid + `val`
        }
      )
    }

    resultRDD.collect().foreach(println)

    sc.stop()
  }
}
